<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<script>
    // 一个构造函数调用多次只返回一个实例（第一次创建的实例）
    const Single = (function () {
        // 实例缓存
        let _instance = null

        // 构造函数
        function Person (name, age) {
            this.name = name
            this.age = age
        }
        // return 出了一个匿名函数，该匿名函数的返回值是一个实例对象 _instance，这里形成闭包，_instance 会一直存在内存中，所以第二次 new 的时候，根据判断，返回的是第一次已被赋值的 _instance
        return function (name, age) {
            console.log(JSON.stringify(_instance))
            if (!_instance) {
                _instance = new Person(name, age)
            }
            return _instance
        }
    })()

    new Single('hello', 20);
    new Single('world', 31);
</script>
</body>
</html>
